Forum des exercices du projet Zuul

Exercice 7.35.1

  
 
Avatar Denis BUREAU
Exercice 7.35.1
par Denis BUREAU, jeudi 10 octobre 2013, 15:59
 

En s'inspirant de processCommand() de la classe Game dans zuul-with-enums-v1, remplacer dans interpreteCommand() de la classe GameEngine dans son jeu  la suite de if else par un switch (autorisé sur un type énuméré !) .

Tout recompiler : il ne doit y avoir aucun warning !

Avatar Pacien TRAN-GIRARD
Re: Exercice 7.35.1
par Pacien TRAN-GIRARD, jeudi 27 février 2014, 16:30
 

Peut-on utiliser la réflexion à la place du switch ?

Avatar Denis BUREAU
Re: Exercice 7.35.1
par Denis BUREAU, jeudi 27 février 2014, 20:05
 

Non, le switch est clairement la structure la plus appropriée pour gérer une variable de type enum.

L'API reflection de Java est une grosse machinerie peu performante, et il faudra y regarder à deux fois si vous trouvez une fonctionnalité du jeu pour laquelle elle pourrait avoir un intérêt.

Avatar Daphné CARON
Re: Exercice 7.35.1
par Daphné CARON, jeudi 29 mai 2014, 16:29
 

Bonjour,

Après avoir ecrit le switch, le compilateur nous indique un message d'erreur : " an enum switch case label must be the unqualified name of a enumeration constant"

CommandWord commandWord = command.getCommandWord();

        switch(commandWord){
            case CommandWord.aide :
                aide();
                break;

 

L'expression à tester et la valeur sont bien des commandWord.

Avatar Denis BUREAU
Re: Exercice 7.35.1
par Denis BUREAU, vendredi 30 mai 2014, 11:07
 

Un 'qualified name' est de la forme Classe.membre alors qu'un 'unqualified name' est simplement de la forme membre, et un 'case label' est ce qui se trouve entre case et :.

D'autre part, les constantes d'un enum sont toujours écrites en majuscules (regardez l'exemple dans zuul-with-enum).

Avatar Kevin PINTO
Re: Exercice 7.35.1
par Kevin PINTO, vendredi 25 novembre 2016, 20:16
 

Bonjour,

j'ai un problème qui concerne le switch.

Dans interpretCommand j'ai :

aGui.println(pCommandLine);
Command vCommand = aParser.getCommand(pCommandLine);
CommandWord vCommandWord = vCommand.getCommandWord();

switch(vCommandWord)
  {
      .../... code supprimé .../...

      case UNKNOWN : aGui.println("Cette commande n'existe pas");
      break;
      .../... code supprimé .../...
  }

Mais quand je lance le jeu, quelque soit les commandes que je rentre, ça m'affiche "Cette commande n'existe pas", donc la commande est inconnue.

Avatar Denis BUREAU
Re: Exercice 7.35.1
par Denis BUREAU, samedi 31 mai 2014, 12:23
 

Je pense que le pb ne vient pas du code ci-dessus, mais de l'endroit où votre programme décide de choisir le CommandWord UNKNOWN en fonction de la String que vous avez tapée. Les String dans CommandWords sont-elles correctes ?

Avatar Kevin PINTO
Re: Exercice 7.35.1
par Kevin PINTO, vendredi 25 novembre 2016, 20:19
 

Il me semble qu'elles le sont, j'ai comme constructeur par défault de la classe CommandWords :

 

public CommandWords()
{
      this.aValidCommands = new HashMap<String, CommandWord>();
      this.aValidCommands.put("go", CommandWord.GO);
      .../... code supprimé .../...
}

Ce qui permet d'initialiser la HashMap aValidCommands.

 

Et pour reconnaître la commande tapé :

public CommandWord getCommandWord(final String pCommandWord)
{
     CommandWord vCommand = this.aValidCommands.get(pCommandWord);
           if(vCommand != null)

           {
                 return vCommand;
           }
           else

           {
                 return CommandWord.UNKNOWN;
           }

Qui doit normalement retourner la commande UNKNOWN si la commande est inconnue et retourner la commande passé en paramètre si elle est connue.

Avatar Denis BUREAU
Re: Exercice 7.35.1
par Denis BUREAU, lundi 8 mai 2017, 22:54
 

Si getCommandWord retourne UNKNOWN, c'est que vCommand vaut null, donc que la String pCommandWord n'a pas été trouvée dans la HashMap.
Ajoutez au début de la méthode getCommandWord un affichage de pCommandWord, et s'il est correct, un affichage de this.aValidCommands qui vous montrera toutes les associations stockées dans la HashMap.
Cela devrait vous aider à comprendre d'où vient le problème.